package com.tree.leetcode.array;

/**
 * @ClassName com.tree.leetcode.array
 * Description: LCR 004. 只出现一次的数字 II
给你一个整数数组 nums ，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1：
输入：nums = [2,2,3,2]
输出：3
示例 2：
输入：nums = [0,1,0,1,0,1,100]
输出：100
提示：
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次
 * @Author frankzsliu
 * @Date 2024/3/14 15:00
 * @Version 1.0
 */
public class SingleNumber_lcr004 {
    public static void main(String[] args) {
        int[] nums = {2,2,2,3};
        System.out.println(singleNumber(nums));
    }
    public static int singleNumber(int[] nums) {
        int[] res = new int[32];
        //从第一位开始
        int mod = 1;
        int sum = 0;
        for (int i = 0; i< 32; i++){
            for(int j =0; j< nums.length; j++){
                //统计所有的数字在mod位的二进制和有多少个1
                //如果nums[j]&mod不为0， name%3之后一定为
                //如果为0， 那一定所有数字都是0
                if((nums[j]&mod) != 0 ){
                    //第i位不为0的个数加一
                    res[i] ++;
                }
            }
            //当前i位%3的余数， 实际res[i] 只有可能为0或者1
            res[i] = res[i]%3;
            // 和前一位和加上当前第i位的数字， 二进制位的加法
            sum = sum + res[i]*mod;
            //mod左移一位继续计算
            mod = mod << 1;
        }
        return sum;
    }
}
